// getter and setter
// 这个例子中可以保护私有属性 _name
class Person14 {
  constructor(private _name: string) {}
  get name() {
    return this._name + " lee";
  }
  set name(name: string) {
    const realName = name.split(" ")[0];
    this._name = realName;
  }
}

const person14 = new Person14("dell");
console.log(person14.name);
person14.name = "dell lee";
console.log(person14.name);

// 单例模式生成器
class Demo {
  private static instance: Demo;
  // constructor 为私有属性，所以外部无法通过 new Demo() 来生成实例（但是在类的内部可以通过 new Demo 来生成实例）
  private constructor(public name: string) {}
  // 把 getInstance 方法挂在 Demo 上，而非挂在实例上
  static getInstance() {
    if (!this.instance) {
      this.instance = new Demo("dell lee");
    }
    return this.instance;
  }
}

const demo1 = Demo.getInstance();
const demo2 = Demo.getInstance();
console.log(demo1.name);
console.log(demo2.name);
